//
//  DAOBase.m
//  PrecargaDepositosIOS
//
//  Created by Gabriel Cruz on 7/8/13.
//  Copyright (c) 2013 Trascend N.C. All rights reserved.
//

#import "DAOBase.h"

@implementation DAOBase

- (NSString *) obtenerRutaBD
{
    //  NSLog(@"<%@: %@.%@>", @"Entrando al metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    NSString *dirDocs;
    NSArray *rutas;
    NSString *rutaBD;
    
    rutas = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    dirDocs = [rutas objectAtIndex:0];
    
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    
    rutaBD = [[NSString alloc] initWithString:[dirDocs stringByAppendingPathComponent:@"precargaDepositos.sqlite"]];
    
    if([fileMgr fileExistsAtPath:rutaBD] == NO){
        [fileMgr copyItemAtPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"precargaDepositos.sqlite"] toPath:rutaBD error:NULL];
    }
    
    //  NSLog(@"<%@: %@.%@>", @"Saliendo del metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    return rutaBD;
}


-(BOOL)ejecutarSentenciaSql:(NSString *)sentenciaPorEjecutar : (NSError **) error
{
    //    NSLog(@"<%@: %@.%@>", @"Entrando al metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    BOOL respuesta = NO;
    int codigoError;
    NSDictionary *info;
    
    NSString *ubicacionDB = [self obtenerRutaBD];
    
    if(sqlite3_open_v2([ubicacionDB UTF8String], &bd,SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
    {
        const char *sentenciaSQL = [sentenciaPorEjecutar UTF8String];
        
        sqlite3_stmt *sqlStatement;
        
        if(sqlite3_prepare_v2(bd, sentenciaSQL, -1, &sqlStatement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(sqlStatement) == SQLITE_DONE) {
                respuesta = YES;
            }
            else
            {
                info = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Error ejecutando el statement. Error:'%s'", sqlite3_errmsg(bd)]};
                codigoError = ErrorEjecutandoStatement;
            }
        }
        else
        {
            info = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Problema al preparar el statement. Error: %s ", sqlite3_errmsg(bd)]};
            codigoError = ErrorPreparandoStatement;
        }
    }
    else
    {
        info = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"No se puede conectar con la BD. Error: %s ", sqlite3_errmsg(bd)]};
        codigoError = ErrorUbicandoBaseDeDatos;
    }
    
    if (!respuesta)
    {
        if (error != NULL) *error = [NSError errorWithDomain:dominioErroresDao code:codigoError userInfo:info];
    }
    
    //    NSLog(@"<%@: %@.%@>", @"Saliendo del metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    return respuesta;
}


-(int) obtenerIdInsertadoEnlaClase : (Class) clase : (NSError **) error
{
    //    NSLog(@"<%@: %@.%@>", @"Entrando al metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    int respuesta = 0;
    int codigoError = ErrorEjecutandoStatement;
    NSDictionary *info = @{NSLocalizedDescriptionKey: @"Error obteniendo el ultimo id insertado"};
    
    NSString *ubicacionDB = [self obtenerRutaBD];
    
    if(sqlite3_open_v2([ubicacionDB UTF8String], &bd,SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
    {
        const char *sentenciaSQL = [[NSString stringWithFormat:@"SELECT max(id) FROM '%@'", [clase description]] UTF8String];
        
        sqlite3_stmt *sqlStatement;
        
        if(sqlite3_prepare_v2(bd, sentenciaSQL, -1, &sqlStatement, NULL) == SQLITE_OK)
        {
            while(sqlite3_step(sqlStatement) == SQLITE_ROW)
            {
                respuesta = sqlite3_column_int(sqlStatement, 0);
            }
        }
        else
        {
            info = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Problema al preparar el statement. Error: %s ", sqlite3_errmsg(bd)]};
            codigoError = ErrorPreparandoStatement;
        }
    }
    else
    {
        info = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"No se puede conectar con la BD. Error: %s ", sqlite3_errmsg(bd)]};
        codigoError = ErrorUbicandoBaseDeDatos;
    }
    
    if (respuesta == 0)
    {
        if (error != NULL) *error = [NSError errorWithDomain:dominioErroresDao code:codigoError userInfo:info];
    }
    
    //    NSLog(@"<%@: %@.%@>", @"Saliendo del metodo", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    
    return respuesta;
}

- (NSString *) convertirDateEnString : (NSDate *) date
{
    NSDateFormatter*dateFormat =[[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    return [dateFormat stringFromDate : date];
}


- (NSDate *) convertirStringEnDate : (NSString *) stringFecha
{
    NSDateFormatter*dateFormat =[[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    return [dateFormat dateFromString : stringFecha];
}

@end
